(function () {
	var widgetName = 'map';

	UM.registerWidget(widgetName, {
		tpl:
			'<style type="text/css">' +
			'.edui-dialog-map .edui-map-content{width:530px; height: 350px;margin: 10px auto;}' +
			'.edui-dialog-map .edui-map-content table{width: 100%}' +
			'.edui-dialog-map .edui-map-content table td{vertical-align: middle;}' +
			'.edui-dialog-map .edui-map-button { border: 1px solid #ccc; float: left; cursor: default; height: 23px; width: 70px; cursor: pointer; margin: 0; font-size: 12px; line-height: 24px; text-align: center; }' +
			'.edui-dialog-map .edui-map-button:hover {background:#eee;}' +
			'.edui-dialog-map .edui-map-city,.edui-dialog-map .edui-map-address{height:21px;background: #FFF;border:1px solid #d7d7d7; line-height: 21px;}' +
			'.edui-dialog-map .edui-map-city{width:90px}' +
			'.edui-dialog-map .edui-map-address{width:150px}' +
			'.edui-dialog-map .edui-map-dynamic-label span{vertical-align:middle;margin: 3px 0px 3px 3px;}' +
			'.edui-dialog-map .edui-map-dynamic-label input{vertical-align:middle;margin: 3px;}' +
			'</style>' +
			'<div class="edui-map-content">' +
			'<table>' +
			'<tr>' +
			'<td><%=lang_city%>:</td>' +
			'<td><input class="edui-map-city" type="text" value="<%=city.value%>"/></td>' +
			'<td><%=lang_address%>:</td>' +
			'<td><input class="edui-map-address" type="text" value="" /></td>' +
			'<td><a class="edui-map-button"><%=lang_search%></a></td>' +
			'<td><label class="edui-map-dynamic-label"><input class="edui-map-dynamic" type="checkbox" name="edui-map-dynamic" /><span><%=lang_dynamicmap%></span></label></td>' +
			'</tr>' +
			'</table>' +
			'<div style="width:100%;height:340px;margin:5px auto;border:1px solid gray" class="edui-map-container"></div>' +
			'</div>' +
			'<script class="edui-tpl-container" type="text/plain">' +
			'<!DOCTYPE html>' +
			'<html>' +
			'<head>' +
			'<title></title>' +
			'</head>' +
			'<body>' +
			'<scr_ipt>' +
			'window.onload = function(){' +
			'var scripts = document.scripts || document.getElementsByTagName("script"),' +
			'src = [];' +
			'for( var i = 1, len = scripts.length; i<len; i++ ) {' +
			'src.push( scripts[i].src );' +
			'}' +
			"parent.UM.getEditor(<<id>>).getWidgetData('map').requestMapApi( src );" +
			'};' +
			'function mapReadyStateChange ( state ) { ' +
			" if ( state === 'complete' || state === 'loaded' ) {" +
			' document.close(); ' +
			' } }' +
			'</scr_ipt>' +
			'<scr_ipt onreadystatechange=\'mapReadyStateChange(this.readyState);\' onload=\'mapReadyStateChange("loaded");\' src="http://api.map.baidu.com/api?v=2.0&ak=6b6c1a67eaa7db1ca6d6da28e590e343&services=true"></scr_ipt>' +
			'</body>' +
			'</html>' +
			'</script>',
		initContent: function (editor, $widget) {
			var me = this,
				lang = editor.getLang(widgetName),
				theme_url = editor.options.themePath + editor.options.theme;

			if (me.inited) {
				me.preventDefault();
				return false;
			}

			me.inited = true;

			me.lang = lang;
			me.editor = editor;

			me.root().html(
				$.parseTmpl(
					me.tpl,
					$.extend({}, lang['static'], {
						theme_url: theme_url,
					})
				)
			);

			me.initRequestApi();
		},
		/**
		 * ��ʼ������API
		 */
		initRequestApi: function () {
			var $ifr = null;

			//�Ѿ���ʼ������ �����ٴγ�ʼ��
			if (window.BMap && window.BMap.Map) {
				this.initBaiduMap();
			} else {
				$ifr = $('<iframe style="display: none;"></iframe>');
				$ifr.appendTo(this.root());

				$ifr = $ifr[0].contentWindow.document;

				$ifr.open();
				$ifr.write(
					this.root()
						.find('.edui-tpl-container')
						.html()
						.replace(/scr_ipt/g, 'script')
						.replace('<<id>>', "'" + this.editor.id + "'")
				);
			}
		},
		requestMapApi: function (src) {
			var me = this;

			if (src.length) {
				var _src = src[0];

				src = src.slice(1);

				if (_src) {
					$.getScript(_src, function () {
						me.requestMapApi(src);
					});
				} else {
					me.requestMapApi(src);
				}
			} else {
				me.initBaiduMap();
			}
		},
		initBaiduMap: function () {
			var $root = this.root(),
				map = new BMap.Map($root.find('.edui-map-container')[0]),
				me = this,
				marker,
				point,
				imgcss,
				img = $(me.editor.selection.getRange().getClosedNode());

			map.enableInertialDragging();
			map.enableScrollWheelZoom();
			map.enableContinuousZoom();

			if (img.length && /api[.]map[.]baidu[.]com/gi.test(img.attr('src'))) {
				var url = img.attr('src'),
					centerPos = me.getPars(url, 'center').split(','),
					markerPos = me.getPars(url, 'markers').split(',');
				point = new BMap.Point(Number(centerPos[0]), Number(centerPos[1]));
				marker = new BMap.Marker(new BMap.Point(Number(markerPos[0]), Number(markerPos[1])));
				map.addControl(new BMap.NavigationControl());
				map.centerAndZoom(point, Number(me.getPars(url, 'zoom')));
				imgcss = img.attr('style');
			} else {
				point = new BMap.Point(116.404, 39.915); // ����������
				marker = new BMap.Marker(point);
				map.addControl(new BMap.NavigationControl());
				map.centerAndZoom(point, 10); // ��ʼ����ͼ,�������ĵ�����͵�ͼ����
			}
			marker.enableDragging();
			map.addOverlay(marker);

			me.map = map;
			me.marker = marker;
			me.imgcss = imgcss;
		},
		doSearch: function () {
			var me = this,
				city = me.root().find('.edui-map-city').val(),
				address = me.root().find('.edui-map-address').val();

			if (!city) {
				alert(me.lang.cityMsg);
				return;
			}
			var search = new BMap.LocalSearch(city, {
				onSearchComplete: function (results) {
					if (results && results.getNumPois()) {
						var points = [];
						for (var i = 0; i < results.getCurrentNumPois(); i++) {
							points.push(results.getPoi(i).point);
						}
						if (points.length > 1) {
							me.map.setViewport(points);
						} else {
							me.map.centerAndZoom(points[0], 13);
						}
						point = me.map.getCenter();
						me.marker.setPoint(point);
					} else {
						alert(me.lang.errorMsg);
					}
				},
			});
			search.search(address || city);
		},
		getPars: function (str, par) {
			var reg = new RegExp(par + '=((\\d+|[.,])*)', 'g');
			return reg.exec(str)[1];
		},
		reset: function () {
			this.map && this.map.reset();
		},
		initEvent: function () {
			var me = this,
				$root = me.root();

			$root.find('.edui-map-address').on('keydown', function (evt) {
				evt = evt || event;
				if (evt.keyCode == 13) {
					me.doSearch();
					return false;
				}
			});

			$root.find('.edui-map-button').on('click', function (evt) {
				me.doSearch();
			});

			$root.find('.edui-map-address').focus();

			$root.on('mousewheel DOMMouseScroll', function (e) {
				return false;
			});
		},
		width: 580,
		height: 408,
		buttons: {
			ok: {
				exec: function (editor) {
					var widget = editor.getWidgetData(widgetName),
						center = widget.map.getCenter(),
						zoom = widget.map.getZoom(),
						size = widget.map.getSize(),
						point = widget.marker.P;

					if (widget.root().find('.edui-map-dynamic')[0].checked) {
						var URL = editor.getOpt('UMEDITOR_HOME_URL'),
							url = [
								URL +
									(/\/$/.test(URL) ? '' : '/') +
									'dialogs/map/map.html' +
									'#center=' +
									center.lng +
									',' +
									center.lat,
								'&zoom=' + zoom,
								'&width=' + size.width,
								'&height=' + size.height,
								'&markers=' + point.lng + ',' + point.lat,
							].join('');
						editor.execCommand(
							'inserthtml',
							'<iframe class="ueditor_baidumap" src="' +
								url +
								'" frameborder="0" width="' +
								(size.width + 4) +
								'" height="' +
								(size.height + 4) +
								'"></iframe>'
						);
					} else {
						url =
							'http://api.map.baidu.com/staticimage?center=' +
							center.lng +
							',' +
							center.lat +
							'&zoom=' +
							zoom +
							'&width=' +
							size.width +
							'&height=' +
							size.height +
							'&markers=' +
							point.lng +
							',' +
							point.lat;
						editor.execCommand(
							'inserthtml',
							'<img width="' +
								size.width +
								'"height="' +
								size.height +
								'" src="' +
								url +
								'"' +
								(widget.imgcss ? ' style="' + widget.imgcss + '"' : '') +
								'/>',
							true
						);
					}

					widget.reset();
				},
			},
			cancel: {
				exec: function (editor) {
					editor.getWidgetData(widgetName).reset();
				},
			},
		},
	});
})();
